package com.cjzuji.rental.controller.excel;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/text/excel")
public class ExcelProcessor {
    private static final Logger log = LoggerFactory.getLogger(ExcelProcessor.class);

    // 定义数据结构
    static class OrderData {
        String orderTime;
        String name;
        String phone;
        String idCard;

        // 构造函数
        public OrderData(String orderTime, String name, String phone, String idCard) {
            this.orderTime = orderTime;
            this.name = name;
            this.phone = phone;
            this.idCard = idCard;
        }

        // MD5加密方法
        public void encryptSensitiveData() {
            this.name = DigestUtils.md5Hex(this.name);
            this.phone = DigestUtils.md5Hex(this.phone);
            this.idCard = DigestUtils.md5Hex(this.idCard);
        }
    }

    /**
     * 读取Excel文件并返回数据列表
     */
    public static List<OrderData> readExcel(InputStream inputStream) throws IOException {
        List<OrderData> dataList = new ArrayList<>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm");

        try (Workbook workbook = new XSSFWorkbook(inputStream)) {
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

            // 跳过标题行，从第二行开始读取数据
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if (row != null) {
                    String orderTime = "";
                    String name = "";
                    String phone = "";
                    String idCard = "";

                    try {
                        // 处理时间单元格（可能是日期格式或字符串格式）
                        Cell timeCell = row.getCell(0);
                        if (timeCell != null) {
                            if (timeCell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(timeCell)) {
                                // 如果是日期格式
                                Date date = timeCell.getDateCellValue();
                                orderTime = dateFormat.format(date);
                            } else {
                                // 如果是字符串格式
                                orderTime = timeCell.getStringCellValue().trim();
                            }
                        }

                        // 处理其他单元格
//                        name = row.getCell(1) != null ? row.getCell(1).getStringCellValue().trim() : "";
//                        phone = row.getCell(2) != null ? row.getCell(2).getStringCellValue().trim() : "";
//                        idCard = row.getCell(3) != null ? row.getCell(3).getStringCellValue().trim() : "";

                        name = getCellStringValue(row.getCell(1)).trim();
                        phone = getCellStringValue(row.getCell(2)).trim();
                        idCard = getCellStringValue(row.getCell(3)).trim();



                        dataList.add(new OrderData(orderTime, name, phone, idCard));
                    } catch (Exception e) {
                        log.error("读取第{}行数据时出错: {}", i + 1, e.getMessage());
                    }
                }
            }
        }

        return dataList;
    }

    /**
     * 辅助方法：将单元格内容统一转换为字符串
     */
    private static String getCellStringValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                // 处理数字格式（包括日期，但日期已在readExcel中单独处理）
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 如果是日期格式，这里应该不会执行，因为日期已在readExcel中处理
                    return cell.getDateCellValue().toString();
                } else {
                    // 普通数字格式
                    return String.valueOf((long) cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                // 处理公式单元格
                switch (cell.getCachedFormulaResultType()) {
                    case STRING:
                        return cell.getStringCellValue();
                    case NUMERIC:
                        return String.valueOf((long) cell.getNumericCellValue());
                    default:
                        return "";
                }
            case BLANK:
            case _NONE:
                return "";
            default:
                return "";
        }
    }

    /**
     * 处理数据：对敏感信息进行MD5加密
     */
    public static List<OrderData> processData(List<OrderData> dataList) {
        List<OrderData> processedList = new ArrayList<>();
        for (OrderData data : dataList) {
            OrderData newData = new OrderData(
                    data.orderTime, // 时间不变
                    data.name,
                    data.phone,
                    data.idCard
            );
            newData.encryptSensitiveData(); // 加密敏感信息
            processedList.add(newData);
        }
        return processedList;
    }

    /**
     * 将处理后的数据写入新的Excel文件并保存到本地
     */
    public static File writeExcelToLocal(List<OrderData> dataList, String outputPath) throws IOException {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("订单数据");

            // 创建标题行
            Row headerRow = sheet.createRow(0);
            headerRow.createCell(0).setCellValue("下单时间");
            headerRow.createCell(1).setCellValue("姓名(MD5)");
            headerRow.createCell(2).setCellValue("号码(MD5)");
            headerRow.createCell(3).setCellValue("身份证号码(MD5)");

            // 填充数据
            for (int i = 0; i < dataList.size(); i++) {
                OrderData data = dataList.get(i);
                Row row = sheet.createRow(i + 1);
                row.createCell(0).setCellValue(data.orderTime);
                row.createCell(1).setCellValue(data.name);
                row.createCell(2).setCellValue(data.phone);
                row.createCell(3).setCellValue(data.idCard);
            }

            // 自动调整列宽
            for (int i = 0; i < 4; i++) {
                sheet.autoSizeColumn(i);
            }

            // 创建输出文件
            File outputFile = new File(outputPath);
            try (FileOutputStream fos = new FileOutputStream(outputFile)) {
                workbook.write(fos);
            }

            return outputFile;
        }
    }

    @PostMapping("/upload")
    public ResponseEntity<String> uploadExcel(@RequestParam("file") MultipartFile file) {
        String outputPath = "processed_data_" + System.currentTimeMillis() + ".xlsx";

        try {
            // 1. 读取Excel文件
            List<OrderData> dataList = readExcel(file.getInputStream());
            log.info("成功读取Excel文件，共{}条记录", dataList.size());

            // 2. 处理数据
            List<OrderData> processedList = processData(dataList);
            log.info("数据加密处理完成");

            // 3. 生成新的Excel文件并保存到本地
            File outputFile = writeExcelToLocal(processedList, outputPath);
            log.info("处理后的文件已保存到: {}", outputFile.getAbsolutePath());

            return ResponseEntity.ok("文件处理成功，已保存到: " + outputFile.getAbsolutePath());

        } catch (IOException e) {
            log.error("处理Excel文件时出错", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("处理文件时出错: " + e.getMessage());
        }
    }
}
//
//import org.apache.poi.ss.usermodel.*;
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//import org.apache.commons.codec.digest.DigestUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.io.*;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @author bag
// * @version V1.0
// * @date 2025/6/21 16:53
// * @since 1.0
// */
//@RestController
//@RequestMapping("/text/excel")
//public class ExcelProcessor {
//
//    private static final Logger log = LoggerFactory.getLogger(ExcelProcessor.class);
//
//    // 定义数据结构
//    static class OrderData {
//        String orderTime;
//        String name;
//        String phone;
//        String idCard;
//
//        // 构造函数
//        public OrderData(String orderTime, String name, String phone, String idCard) {
//            this.orderTime = orderTime;
//            this.name = name;
//            this.phone = phone;
//            this.idCard = idCard;
//        }
//
//        // MD5加密方法
//        public void encryptSensitiveData() {
//            this.name = DigestUtils.md5Hex(this.name);
//            this.phone = DigestUtils.md5Hex(this.phone);
//            this.idCard = DigestUtils.md5Hex(this.idCard);
//        }
//    }
//
//    /**
//     * 读取Excel文件并返回数据列表
//     */
//    public static List<OrderData> readExcel(InputStream inputStream) throws IOException {
//        List<OrderData> dataList = new ArrayList<>();
//
//        try (Workbook workbook = new XSSFWorkbook(inputStream)) {
//            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
//
//            // 跳过标题行，从第二行开始读取数据
//            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
//                Row row = sheet.getRow(i);
//                if (row != null) {
////                    log.info("执行222===");
////                    log.info("执行222==={}",row.getCell(0).getStringCellValue());
////                    String orderTime = row.getCell(0).getStringCellValue();
//                    String orderTime = "";
//                    String name = row.getCell(1).getStringCellValue();
//                    String phone = row.getCell(2).getStringCellValue();
//                    String idCard = row.getCell(3).getStringCellValue();
//
//                    dataList.add(new OrderData(orderTime, name, phone, idCard));
//                }
//            }
//        }
//
//        return dataList;
//    }
//
//    /**
//     * 处理数据：对敏感信息进行MD5加密
//     */
//    public static List<OrderData> processData(List<OrderData> dataList) {
//        List<OrderData> processedList = new ArrayList<>();
//        for (OrderData data : dataList) {
//            OrderData newData = new OrderData(
//                    data.orderTime, // 时间不变
//                    data.name,
//                    data.phone,
//                    data.idCard
//            );
//            newData.encryptSensitiveData(); // 加密敏感信息
//            processedList.add(newData);
//        }
//        return processedList;
//    }
//
//    /**
//     * 将处理后的数据写入新的Excel文件
//     */
//    public static ByteArrayOutputStream writeExcel(List<OrderData> dataList) throws IOException {
//        try (Workbook workbook = new XSSFWorkbook()) {
//            Sheet sheet = workbook.createSheet("订单数据");
//
//            // 创建标题行
//            Row headerRow = sheet.createRow(0);
//            headerRow.createCell(0).setCellValue("下单时间");
//            headerRow.createCell(1).setCellValue("姓名(MD5)");
//            headerRow.createCell(2).setCellValue("号码(MD5)");
//            headerRow.createCell(3).setCellValue("身份证号码(MD5)");
//
//            // 填充数据
//            for (int i = 0; i < dataList.size(); i++) {
//                OrderData data = dataList.get(i);
//                Row row = sheet.createRow(i + 1);
//                row.createCell(0).setCellValue(data.orderTime);
//                row.createCell(1).setCellValue(data.name);
//                row.createCell(2).setCellValue(data.phone);
//                row.createCell(3).setCellValue(data.idCard);
//            }
//
//            // 自动调整列宽
//            for (int i = 0; i < 4; i++) {
//                sheet.autoSizeColumn(i);
//            }
//
//            // 将Workbook写入ByteArrayOutputStream
//            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//            workbook.write(outputStream);
//            return outputStream;
//        }
//    }
//
//
//    @PostMapping("/upload")
//    public ResponseEntity<byte[]> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
//        // 1. 读取Excel文件
//        List<OrderData> dataList = ExcelProcessor.readExcel(file.getInputStream());
//
//        // 2. 处理数据
//        List<OrderData> processedList = ExcelProcessor.processData(dataList);
//
//        // 3. 生成新的Excel文件
//        ByteArrayOutputStream outputStream = ExcelProcessor.writeExcel(processedList);
//        log.info("执行到该地方");
//
//        // 设置响应头
//        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//        headers.setContentDispositionFormData("attachment", "processed_data.xlsx");
//        log.info("执行到该地方2");
//        return new ResponseEntity<>(outputStream.toByteArray(), headers, HttpStatus.OK);
//    }
//
//    // public static void main(String[] args) {
//    //     // 示例用法
//    //     try {
//    //         // 模拟从文件读取（实际项目中这里应该是上传的文件输入流）
//    //         InputStream inputStream = new FileInputStream("input.xlsx");
//
//    //         // 1. 读取Excel文件
//    //         List<OrderData> dataList = readExcel(inputStream);
//    //         inputStream.close();
//
//    //         // 2. 处理数据（MD5加密）
//    //         List<OrderData> processedList = processData(dataList);
//
//    //         // 3. 生成新的Excel文件
//    //         ByteArrayOutputStream outputStream = writeExcel(processedList);
//
//    //         // 在实际项目中，这里会将outputStream返回给前端
//    //         // 示例中我们将其保存为文件
//    //         try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {
//    //             outputStream.writeTo(fos);
//    //         }
//
//    //         System.out.println("处理完成，输出文件已生成");
//
//    //     } catch (IOException e) {
//    //         e.printStackTrace();
//    //     }
//    // }
//}
